package org.wzl.springframework.factory.support;

import org.wzl.springframework.exception.BeanException;
import org.wzl.springframework.factory.BeanFactory;
import org.wzl.springframework.factory.config.BeanDefinition;

/**
 * 抽象类定义模板方法
 *
 * 该类采用单一职责原理，BeanFactory提供了一个单一的方法。
 *
 * @author 卫志龙
 * @date 2024/1/16 23:00
 */
public abstract class AbstractBeanFactory
        extends DefaultSingletonBeanRegistry
        implements BeanFactory {

    /**
     * 该方法用于获取Bean，其中获取Bean的具体方法由抽象方法实现。
     * @param name
     * @return
     */
    @Override
    public Object getBean(String name) throws BeanException {
        Object bean = getSingleton(name);
        if (bean != null) {
            return bean;
        }

        //这里的getBeanDefinition方法是抽象方法
        BeanDefinition beanDefinition = getBeanDefinition(name);
        return createBean(name, beanDefinition);
    }

    /**
     * 获取Bean定义类
     * @param beanName  bean名称
     * @return          bean的定义类
     */
    public abstract BeanDefinition getBeanDefinition(String beanName) throws BeanException;

    /**
     * 创建bean对象
     * @param beanName          bean名称
     * @param beanDefinition    bean的定义
     */
    protected abstract Object createBean(String beanName, BeanDefinition beanDefinition);

}
